package com.itheima.distributed;

import com.google.gson.Gson;
import com.itheima.pojo.News;
import com.itheima.pojo.SpiderFinal;
import com.itheima.tools.HttpClientUtils;
import com.itheima.tools.IdWorker;
import com.itheima.tools.JedisUtil;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import redis.clients.jedis.Jedis;

import java.io.IOException;
import java.util.List;

/**
 * 获取redis中的url，
 * 发送请求获取新闻数据，
 * 解析新闻数据，
 * 封装成News对象，
 * 将这个News对象存放到redis的list集合中
 */
public class News163Slave {

    /**
     * 分布式id生成器
     * 这里需要注意下:
     * 例子
     * workid表示的是工作站 datacenterid表示的是其中一个服务器
     * 当你使用id生成器,且当前需要分布式部署在不同的服务器上的时候,
     * 需要每一个ip服务器换一下工作站,0~31
     * 否则会产生id生成重复的可能
     */
    private static IdWorker idWorker = new IdWorker(1, 0);

    /**
     * json转换的gson
     */
    private static Gson gson = new Gson();

    public static void main(String[] args) throws IOException {
        while (true) {
            /**
             如果有多个程序一起到redis中, 获取数据, 保证每一个程序拿到的都是唯一的:
             redis中:rpop不是一个线程安全的方法, 当多个程序一起获取的时候, 就会出现重复获取的问题
             解析方法, 使用redis提供的一个阻塞的方法, 帮助解决
             如何使用阻塞的方法:返回值是一个list集合, list集合中只会有二个值, 第一个值表示的key  ,第二值表示的当前弹出的元素
             */
            //获取rides中的url
            Jedis jedis = JedisUtil.getJedis();
            List<String> urlList = jedis.brpop(20, SpiderFinal.SPIDER_NEWS_URLLIST);
            jedis.close();

            //2.根据新闻的docurl，获取新闻的详情页数据（html页面）
            if (urlList == null || urlList.size() == 0) {
                //没有要爬取的url
                break;
            }
            String docUrl = urlList.get(1);
            News news = parseItemNews(docUrl);


            //3.将解析出来的News对象保存到redis的list集合中：
            jedis = JedisUtil.getJedis();
            jedis.lpush(SpiderFinal.SPIDER_NEWS_NEWJSONLIST, gson.toJson(news));
            jedis.close();

        }
    }

    /**
     * 解析每一条新闻的url  -----    新闻的详情页数据
     *
     * @param docurl
     */
    private static News parseItemNews(String docurl) throws IOException {

        News news = new News();

        //1.根据url，发送请求，获取html页面
        String newsHtml = HttpClientUtils.doGet(docurl);

        //2.使用json进行解析html页面---------->封装成一个javabean对象News
        Document document = Jsoup.parse(newsHtml);
        //标题
        String title = document.select("#epContentLeft h1").text();
        System.out.println("标题：" + title);

        //时间和来源
        String timeAndSource = document.select(".post_time_source").text();
        String[] split = timeAndSource.split("　来源: ");
        String time = split[0];
        String source = split[1];
        System.out.println(time + "  " + source);

        //内容
        String content = document.select("#endText p").text();
        System.out.println(content);

        //编辑
        String editorString = document.select(".ep-editor").text();
        String[] editorSpilt = editorString.split("：");
        String editor = editorSpilt[1];
        System.out.println("编辑：" + editor);


        //3. 保存News对象到mysql数据库中
        news.setId(idWorker.nextId() + "");
        news.setTime(time);
        news.setTitle(title);
        news.setEditor(editor);
        news.setSource(source);
        news.setDocurl(docurl);
        news.setContent(content);

        return news;
    }

}

